package com._520it.day2._06_template;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com._520it.util.JdbcUtil;

//jdbc操作模板
public class JDBCTemplate {

	/**
	 * DML操作模板
	 * 
	 * @param sql
	 * @param prams
	 *            sql模板中占位符的参数值
	 * @return DML操作之后，受影响的函数
	 */
	public static int update(String sql, Object... prams) {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = JdbcUtil.getConn();
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < prams.length; i++) {
				ps.setObject(i + 1, prams[i]);
			}
			return ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.close(conn, ps, null);
		}
		// 设置占位符参数
		return 0;
	}

	/**
	 * 
	 * @param sql
	 * @param prams
	 * @return
	 */
	public static  <T> T query(String sql, IResultSetHandler<T> rsh, Object... prams) {

		// 声明需要关闭的资源
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			// 可能出线异常的代码
			conn = JdbcUtil.getConn();
			ps = conn.prepareStatement(sql);
			for (int i = 0; i < prams.length; i++) {
				ps.setObject(i + 1, prams[i]);
			}
			rs = ps.executeQuery();
			// 调用结果集处理器中处理结果集的方法
			return  rsh.handle(rs);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 释放资源
			JdbcUtil.close(conn, ps, rs);
		}
		return null;
	}
}
